package com.it.zhangjun.arithmetic.队列.循环队列;

/**
 * @author zhangj
 * @description 循环队列，新增一个额外空间来区分队列是否已满
 * @date 2021-03-26 10:00
 */
public class MyCircularQueue2 {
    /**
     * 队列头部元素所在的位置
     */
    private int front = 0;
    /**
     * 队列的尾巴
     */
    private int rear = 0;
    /**
     * 存储队列元素的数组
     */
    private int[] a;
    /**
     * 队列的容量
     */
    private int capacity;

    public MyCircularQueue2(int k) {
        capacity = k + 1;
        a = new int[capacity];
    }

    /**
     * 入队操作
     *
     * @param value
     * @return
     */
    public boolean enQueue(int value) {
        //如果队列已满，不能继续放入
        if (isFull()) {
            return false;
        }
        //把元素放到rear位置
        a[rear] = value;
        //rear向后移动
        rear = (rear + 1) % capacity;
        return true;
    }

    /**
     * 出队操作
     *
     * @return
     */
    public boolean deQueue() {
        //如果队列已空，不能继续出队了
        if (isEmpty()) {
            return false;
        }
        //出队，front要向前移动
        front = (front + 1) % capacity;
        return true;
    }

    /**
     * 取出第一个元素
     *
     * @return
     */
    public int front() {
        return isEmpty() ? -1 : a[front];
    }

    /**
     * 取出最后
     *
     * @return
     */
    public int rear() {
        int tail = (rear - 1 + capacity) % capacity;
        return isEmpty() ? -1 : a[tail];
    }

    /**
     * 判断队列是否已空
     *
     * @return
     */
    private boolean isEmpty() {
        return front == rear;
    }

    /**
     * 判断队列是否已满
     *
     * @return
     */
    private boolean isFull() {
        return front == (rear + 1) % capacity;
    }


}